package com.springmq.mq.thread.syn;

import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

/**
 * @ClassName : Ticket
 * @Author : lby
 * @Date: 2021/2/1 14:03
 * @Description : 并发买票测试
 */
@Slf4j
public class Ticket implements Runnable {

    /**
     * 总票数
     */
    private Integer ticketNumbers=10;
    private Boolean type=true;

    @SneakyThrows
    @Override
    public void run() {
        while (type){
          buyTicket();
        }
    }

    /**
     * 利用给对象加锁实现处理
     * synchronized 只能锁当前对象，this
     * 被锁的对象就是公共的对象，可能会被多个线程同时访问的对象
     * 每一个对象只能锁一次，不能用锁套锁的形式
     * 当对象需要加锁时，必须分别加锁，避免锁中有锁，避免死锁的出现
     *
     */
    public synchronized void buyTicket(){
        if (ticketNumbers<=0){
            log.info("没票了");
            type=false;
            return;
        }
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info("{},第{}张票",Thread.currentThread().getName(),ticketNumbers);
        ticketNumbers--;

    }

    public static void main(String[] args) {
        // 测试并发买票
        Ticket ticket = new Ticket();
        new Thread(ticket,"张三").start();
        new Thread(ticket,"李四").start();
        new Thread(ticket,"王五").start();
    }
}
